การวิเคราะห์ Log ของ ELB ด้วย SQL ใน Amazon Athena
Pop จากบริษัท Classmethod (Thailand) ครับ
ครั้งนี้ ผมจะมาแนะนำวิธีการวิเคราะห์ Log ของ ELB ด้วย SQL ใน Amazon Athena โดยทำตามขั้นตอนที่อธิบายไว้ในบทความนี้ได้เลยครับ
สิ่งที่ต้องมี
※ มี Log ของ ELB อยู่ใน S3 แล้ว (สามารถดูตัวอย่างได้ที่บทความด้านล่างนี้ หรือถ้ามี Log ดังกล่าวแล้วข้ามขั้นตอนนี้ไปได้เลย)
การสร้าง S3 Bucket เพื่อบันทึกข้อมูลการรันคำสั่งของ Athena
ก่อนตั้งค่า Query result and encryption settings ในขั้นตอนถัดไป เราต้องมี S3 Bucket ที่ใช้สำหรับบันทึกข้อมูลการรันคำสั่งของ Athena ก่อน จึงจะสามารถรันคำสั่งใน Athena ได้ ให้ทำตามขั้นตอนด้านล่างนี้ได้เลยครับ
ดูตัวอย่างที่นี่: การสร้าง Buckets ใน Amazon S3
รายละเอียดการสร้าง S3 Bucket อันที่ 2 ในบทความนี้คือ:
Bucket name:tinnakorn-test-athena-result
เมื่อสร้างเสร็จแล้วให้เริ่มทำในขั้นตอนถัดไปได้เลยครับ
การตั้งค่า Query result and encryption settings
ผมจะตั้งค่า Query result เพื่อให้สามารถรันคำสั่ง SQL ใน Athena ได้ครับ (ถ้ามีการตั้งค่าไว้แล้วให้ข้ามขั้นตอนนี้ไปได้เลย)
เข้ามาที่ Service [Amazon Athena] แล้วเลือกQuery editor
จากเมนูด้านซ้าย แล้วจะแสดงหน้าจอแบบนี้
เลือกหัวข้อSettings
และคลิกManage
ค้นหา S3 Bucket ที่ใช้บันทึก Access Log ของ ELB ของเรา
แล้วเลือก S3 Bucket ของเรา เช่นtinnakorn-test-athena-result
และคลิกปุ่มChoose
สร้าง Database ใน Athena
ขั้นตอนการสร้าง Database ใน Athena จะแตกต่างกับ AWS Glue ที่ผมได้เขียนไว้ในลิงก์ด้านล่างนี้ แต่ผลลัพธ์ที่ได้จะเหมือนกัน สำหรับผู้ที่สนใจเรียนรู้เพิ่มเติมเกี่ยวกับ AWS Glue คลิกที่ลิงก์บทความด้านล่างนี้ได้เลยครับ
เรียนรู้เพิ่มเติมได้ที่: เตรียมพร้อมการเรียกใช้ SQL ไปยังไฟล์ที่มีอยู่ใน S3 (AWS Glue)
ก่อนอื่นผมจะสร้าง Database ด้วยคำสั่ง SQL ใน Athena
เลือกหัวข้อEditor
แล้ว Copy คำสั่งด้านล่างนี้วางใน Query 1 และคลิกปุ่มRun
(elb_log คือชื่อ Database ที่ใช้สาธิตเท่านั้น)
CREATE DATABASE elb_log;
ตรวจสอบที่ Query results:✅ Completed
และดูที่ Database ด้านซ้าย จะเห็นว่ามีelb_log
เพิ่มขึ้นมา
จากนั้นเลือก Database:elb_log
เตรียมไว้ครับ
สร้าง Table ใน Athena
ต่อไปคือการสร้าง Table ใน Database: elb_log ที่สร้างจากขั้นตอนที่แล้ว
ก่อนอื่นให้เข้าไปยัง S3 Bucket ที่ใช้บันทึก Access Log ของ ELB แล้ว Copy S3 URI เตรียมไว้เพื่อนำไปใช้ในการสร้าง Table โดยทำการ Copy S3 URI ดังนี้:
» เข้าไปยัง Path ตามรูปภาพด้านล่าง
» ติ๊ก✅
ap-southeast-1/ (ap-southeast-1 คือชื่อ Region: Singapore เช่นถ้าใช้ Region: Tokyo ก็จะเป็น ap-northeast-1 เป็นต้น)
» คลิกCopy S3 URI
แล้วบันทึกเตรียมไว้ เช่น
s3://[bucket-name]/AWSLogs/[aws-account-id]/elasticloadbalancing/[region-name]/
กลับมาที่ Athena แล้วสร้าง Table ดังนี้:
» Copy คำสั่งด้านล่างนี้วางใน Query 1 (alb_logs คือชื่อ Table ที่ใช้สาธิตเท่านั้น)
» เปลี่ยน LOCATION ที่บรรทัด 41 ให้เป็นของคุณโดยวาง URI ที่ Copy มาจาก S3 จากขั้นตอนที่แล้วลงไป เช่น
[LOCATION 's3://[bucket-name]/AWSLogs/[aws-account-id]/elasticloadbalancing/[region-name]/'
]
» คลิกปุ่มRun
CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs (
type string,
time string,
elb string,
client_ip string,
client_port int,
target_ip string,
target_port int,
request_processing_time double,
target_processing_time double,
response_processing_time double,
elb_status_code int,
target_status_code string,
received_bytes bigint,
sent_bytes bigint,
request_verb string,
request_url string,
request_proto string,
user_agent string,
ssl_cipher string,
ssl_protocol string,
target_group_arn string,
trace_id string,
domain_name string,
chosen_cert_arn string,
matched_rule_priority string,
request_creation_time string,
actions_executed string,
redirect_url string,
lambda_error_reason string,
target_port_list string,
target_status_code_list string,
classification string,
classification_reason string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1',
'input.regex' =
'([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\s]+?)\" \"([^\s]+)\" \"([^ ]*)\" \"([^ ]*)\"')
LOCATION 's3://[bucket-name]/AWSLogs/[aws-account-id]/elasticloadbalancing/[region-name]/'
ตรวจสอบที่ Query results:✅ Completed
และให้ดูที่ด้านซ้ายตรง Tables จะเห็นว่ามี Table:alb_logs
เพิ่มขึ้นมาแล้ว
รันคำสั่ง SQL ใน Athena
ทีนี้มาทดสอบเรียกดูข้อมูล Log ใน Table ที่สร้างจากขั้นตอนที่แล้วโดยรันคำสั่งนี้ และคลิกปุ่มRun
SELECT * FROM elb_log.alb_logs ORDER BY time DESC LIMIT 10;
เลื่อนลงมาด้านล่างที่หัวข้อ Query results จะเห็นข้อมูลแสดงขึ้นมาแบบนี้
สามารถค้นหาข้อมูลของไฟล์ Log ได้อย่างยืดหยุ่น โดยเขียน SQL QUERY เช่น การนับจำนวนโดยใช้คำสั่ง GROUP BY และการกรองข้อมูลโดยใช้ WHERE เป็นต้น
เสร็จแล้วครับ !
สรุป
แนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดการ Log ของ AWS คือการเก็บไว้ใน S3 ยิ่งไปกว่านั้นด้วยการปรากฎตัวของ Athena จึงทำให้เราสามารถจัดการข้อมูลใน S3 ได้อย่างสะดวกและอิสระมากยิ่งขึ้น เพียงแค่มีข้อมูล S3 ก็สามารถใช้งาน Athena ได้อย่างง่ายดาย สำหรับผู้ที่ยังไม่เคยสัมผัสกับการใช้งาน Amazon Athena แนะนำให้ลองใช้งานดู แล้วคุณจะพบกับความสะดวกในการใช้งานนี้อย่างแน่นอนครับ
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
Pop จากบริษัท Classmethod (Thailand) ครับ !